import Vue from 'vue'

export default function MyI18n (config) {
  // 如果是 new 调用
  if (this instanceof MyI18n) {
    // 将 locale 属性设置成响应式,在 setter 的时候,拿到 vm 实例,调用 vm.$forceUpdate() 去更新视图.
    this.defineLocaleReactive(config.locale)
    // 单独记录 messages
    this.messages = config.messages
    Vue.prototype.$myi18n = this // 记录当前实例,全局只有一个
  } else {
    // 传递
    Vue.prototype.$tt = function (keychain, vm) {
      // 链式获取当前属性的值.
      const value = getValueByKeychain(Vue.prototype.$myi18n.messages[Vue.prototype.$myi18n.locale], keychain)
      // 在模板中记录当前的组件实例对象
      Vue.prototype.$myi18n_vm = vm
      // 返回链式调用的结果,在界面显示(这一步不需要响应式)
      return value
    }
  }
}

MyI18n.prototype.defineLocaleReactive = function (locale) {
  Object.defineProperty(this, 'locale', {
    get () {
      return locale
    },
    set (v) {
      locale = v
      // 当调用 this.$myi18n.locale 时,需要更新视图.
      updateView()
    }
  })
}

let updateView = function () {
  // 视图更新
  Vue.prototype.$myi18n_vm.$forceUpdate()
}

// 支持链式属性值获取 (a.b.c.d)
function getValueByKeychain (object, keychain) {
  const keys = keychain.split('.')
  let finallyValue = object
  for (let i = 0; i < keys.length; i++) {
    finallyValue = finallyValue[keys[i]]
  }
  return finallyValue
}

